平时登录服务器需要查看此时的内存占用,我们会用到free
命令,但是如果不了解具体输出的参数的具体意思,那么就会判断错结果,因此对命令做个总结。
free 命令解释
free
命令用于显示系统中内存的使用情况,包括物理内存、交换分区(Swap)以及缓冲和缓存的内存量。其输出信息帮助用户快速了解内存的总体状态以及各个部分的内存占用情况。
free
命令常见用法
free
:显示内存使用情况,单位为字节。free -m
:以MB(兆字节)为单位显示内存信息。free -g
:以GB(千兆字节)为单位显示内存信息。free -h
:以人类可读的格式(MB、GB)显示内存信息。watch free -m
: 监控内存的动态变化。
free
两种输出内容解释
free
命令输出内容1
1 | [root@iZ2zehlew860ikjfi2brdqZ ~]# free -h |
各个参数解释
Mem:
- total: 总内存(物理内存)的大小。
- used: 已使用的内存,包括应用程序和操作系统占用的内存,以及用于缓存和缓冲的内存。它并不是纯粹由应用程序消耗的内存。
- free: 空闲的内存,即未被使用的物理内存。
- shared: 进程间共享的内存(通常为较小数值)。
- buff/cache: 缓冲和缓存的内存,用于提高系统性能。这里包括:
- 缓冲区(Buffer):存放文件系统元数据、文件目录等信息。
- 缓存(Cache):存储实际的文件内容,以加快文件读取速度。
- available: 可供应用程序立即使用的内存(包含 free 和可以从缓存中释放的部分)。
Swap:
- total: 系统分配的交换分区(Swap)的总大小。
- used: 当前使用的交换分区的大小。
- free: 空闲的交换分区的大小。
内存参数详解
free 和 available 的区别:
- free 表示目前未被分配的内存,但系统的缓存和缓冲部分也可以被回收给应用程序,所以
free
不能完全反映内存的真实可用性。 - available 是真正的可用内存,它更接近实际情况,包含
free
和部分buff/cache
,并表示如果应用程序需要内存,操作系统可以释放出来的内存。
- free 表示目前未被分配的内存,但系统的缓存和缓冲部分也可以被回收给应用程序,所以
buff/cache 的重要性:
缓冲和缓存部分虽然被列为已使用的内存,但操作系统可以根据需要将它们回收,因此它们不完全属于已用内存。通过缓存最近访问的文件数据,系统能加快文件访问的速度,提高整体性能。
这种设计原则被称为 “Free Memory is Wasted Memory”,即系统尽量利用空闲内存来提升性能,而不是将其空置。
查看内存占用率
1 | free -m | awk 'NR==2{printf "%.2f%%\n", ($2-$7)*100/$2}' |
free
命令输出内容2
1 | root@old-gateway:~# free -h |
free -h
命令的输出显示了系统内存的使用情况,以下是每个参数的解释:
第一行 Mem
(物理内存)
字段 | 含义 |
---|---|
total | 总共的物理内存容量,包括所有已使用和未使用的内存。 |
used | 已使用的内存,包括被应用程序和系统占用的内存。 |
free | 完全空闲、未被使用的内存量。 |
shared | 被多个进程共享的内存量,通常用于进程间通信。 |
buffers | 用作块设备缓冲区的内存量,主要用于磁盘写操作的缓冲。 |
cached | 文件系统缓存,表示系统用来缓存文件的内存。 |
示例解释:
1 | Mem: 31G 31G 348M 524K 196M 24G |
- total(31G): 系统总共有 31GB 的物理内存。
- used(31G): 已经使用了 31GB 内存,包含缓存和缓冲区。
- free(348M): 只有 348MB 的内存处于空闲状态,但大部分被缓存和缓冲区占用。
- shared(524K): 进程间共享的内存只有 524KB,通常比较小。
- buffers(196M): 用于块设备操作的缓冲区占用了 196MB。
- cached(24G): 文件系统缓存占用了 24GB。
第二行 -/+ buffers/cache
(实际应用程序占用的内存)
这一行显示了系统内存除去缓冲区和缓存后,应用程序实际占用的内存和可用内存。
字段 | 含义 |
---|---|
used | 实际被应用程序和操作系统核心占用的内存,不包括缓存和缓冲区。 |
free | 去掉缓存和缓冲区后,系统可供新进程使用的内存量。 |
示例解释:
1 | -/+ buffers/cache: 6.1G 25G |
- used(6.1G): 去除缓存和缓冲区后,应用程序实际使用的内存是 6.1GB。
- free(25G): 去掉缓存后,系统可以使用的可用内存是 25GB。
注意: 内存实际上没有 “被完全占用”,缓存的内存可以随时释放给需要的应用程序,因此,
free
显示的低空闲内存并不意味着内存不足。
第三行 Swap
(交换分区)
字段 | 含义 |
---|---|
total | 系统中配置的交换分区总大小。 |
used | 已使用的交换分区的大小。 |
free | 还未使用的交换分区大小。 |
示例解释:
1 | Swap: 0B 0B 0B |
- total(0B): 系统没有启用交换分区。
- used(0B): 没有使用交换分区。
- free(0B): 没有可用的交换分区空间。
Swap 是系统在物理内存不足时,借用磁盘空间作为虚拟内存使用的部分。在这台机器上,交换分区没有启用。
其实两种输出方式大差不差,只不过 buffers和cached合并分开而已。
查看内存占用率
1 | free -m | awk 'NR==2{printf "%.2f%%\n", ($3-$6-$7)*100/$2}' |
内存为什么会占用这么高
通过上述了解,我们知道其实有时候内存占用高只是Cache
和Buffer
高而已。
内存的缓存(cache
)占用高通常是由于操作系统在将文件和数据读入内存时,会将它们缓存在内存中以提高后续访问的速度。这是 Linux 和其他现代操作系统的一种优化机制,称为文件系统缓存。即使看起来内存被大量使用,实际上这些缓存可以在系统需要时释放出来用于其他程序。
原因分析
- 文件系统缓存:操作系统会将经常访问的文件、磁盘块等数据保存在内存中,以便于快速访问。缓存占用较多时意味着系统中有大量的文件操作。
- 空闲内存使用策略:Linux 系统采用了 “空闲内存是浪费的内存” 策略,它会尽可能地将空闲内存用作文件缓存,以便提升性能。这就是为什么看起来系统内存占用率高,但其实大部分是缓存,随时可以释放。
- 缓存的释放:当其他进程需要内存时,Linux 会自动释放这些缓存来满足应用程序的需求。因此,高缓存占用通常不会对系统性能造成太大影响。
如何检查具体缓存情况
查看缓存类型:可以使用
slabtop
或cat /proc/meminfo
来查看系统内的缓存信息,找出具体哪种缓存类型占用内存。1
cat /proc/meminfo | grep -i 'cache'
输出类似:
1
2
3Cached: 25284800 kB
SwapCached: 0 kB
...手动释放缓存:如果你需要手动释放缓存,可以使用以下命令:
1
sync; echo 3 > /proc/sys/vm/drop_caches
这会清除页面缓存、目录项和 inode,但请谨慎操作,通常不建议频繁手动释放缓存,系统会在需要时自动管理。
高缓存占用的影响
- 对系统性能的影响:缓存的高占用通常是有益的,因为它减少了从磁盘读取数据的时间,提升了系统性能。
- 内存不足的情况:如果内存不足,Linux 会自动释放缓存,并将内存分配给需要的进程。因此,高缓存占用不会引发内存不足的问题,只要进程需要更多内存,缓存会被清理掉。
总的来说,高缓存占用是一种系统优化策略,通常不是问题,除非你观察到内存不足或者性能瓶颈。